package com.gitee.liuzhi.design.create;

import com.gitee.liuzhi.common.model.Student;

/**
 * @Author liuzhi
 * @Date 2023/8/26 20:13
 * @Version 1.0
 * @Description 建造者模式 Builder Pattern
 * <p>
 * 建造者模式使用多个简单的对象一步一步构建成一个复杂的对象
 * 一个 Builder 类会一步一步构造最终的对象, 该 Builder 类是独立于其他对象的
 * 与工厂模式的区别是 : 建造者模式更加关注与零件装配的顺序
 * <p>
 * 优点
 * 1. 可以将复杂对象的构建过程与其表示分离, 使得同样地构建过程可以创建不同的表示
 * 2. 可以更容易地控制对象的创建过程, 同时使得代码更易于维护和扩展
 * 3. 可以避免在创建对象时重复的代码, 提高了代码的复用性
 * <p>
 * 缺点
 * 1. 建造者模式的代码结构较为复杂, 需要创建多个类来实现
 * 2. 当需要创建的对象较为简单时, 建造者模式可能会显得过于繁琐
 * <p>
 * 场景
 * 1. 当需要创建多个相似对象时, 例如使用相同地构建过程创建不同的表示
 * 2. 当创建一个对象需要多个步骤时, 例如需要设置多个属性或调用多个方法
 * 3. 当需要在不同的上下文中创建不同的对象表示时, 例如根据用户的选择创建不同的表示
 * 4. 当需要控制对象的创建过程, 并且希望代码易于维护和扩展时
 */
public class BuilderPattern {

    public static void main(String[] args) {
        StudentBuilder builder = new StudentBuilder();
        builder.setName("name");
        builder.setAge(18);
        builder.setId(1);
        Student student = builder.build();
        System.out.println(student);
    }

    public static class StudentBuilder {

        private final Student student = new Student();

        public void setName(String name) {
            student.setName(name);
        }

        public void setId(Integer id) {
            student.setId(id);
        }

        public void setAge(Integer age) {
            student.setAge(age);
        }

        public Student build() {
            return student;
        }
    }

}
